perm filename PUMA.SAI[11,HE] blob
sn#524120 filedate 1980-07-23 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00004 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 BEGIN
C00003 00003 ! PEEK, POKE, PEEKARRAY, POKEARRAY, ALINIT
C00008 00004 ! program to talk to PUMA from 10 via DZ11
C00012 ENDMK
C⊗;
BEGIN
DEFINE CRLF="('15&'12)",
! = "COMMENT ",
TIL="STEP 1 UNTIL";
INTEGER ELFCHAN; ! Channel number for I/O to ELF;
EXTERNAL INTEGER _SKIP_;
DEFINE SGNEXT="'4000000"; ! extend sign bit of input data ;
DEFINE OWPW ="0"; ! word for word transfer;
DEFINE TWRJ ="'1000000"; ! two words per word,right justified in each halfword;
DEFINE TWRM ="'2000000"; ! two words per word,in right most 32 bits;
DEFINE TWLM ="'3000000"; ! two words per word,in left most 32 bits;
! PEEK, POKE, PEEKARRAY, POKEARRAY, ALINIT;
SIMPLE INTEGER PROCEDURE CALLU0(STRING UUO;INTEGER AC;REFERENCE INTEGER ADDR);
BEGIN
INTEGER UUOCODE;
UUOCODE←CALL(CVSIX(UUO),"CALLIT");
IF UUOCODE=0 THEN PRINT("NO SUCH UUO: ",UUO)
ELSE RETURN(CODE(UUOCODE+(AC LSH 23),ADDR));
END;
SIMPLE INTEGER PROCEDURE IOWD(INTEGER N,LOC);
RETURN(((-N)LAND '777777)LSH 18 +(LOC-1));
INTEGER MTAPE_PLUS_ELF;
DEFINE ELFMTAPE(ADDR)="CODE(MTAPE_PLUS_ELF,ADDR)";
! peek,poke and peekarray take the actual address on the unibus;
INTEGER PROCEDURE PEEK(INTEGER ADR);
BEGIN "peek" ! Returns the ELF word at unibus address ADR;
INTEGER ARRAY A[1:2];
DEFINE PEEK = "'002000000000";
A[1]←PEEK+(ADR LSH -1);
! CALLU0("MTAPE",ELFCHAN,A[1]);
ELFMTAPE(A[1]);
IF NOT _SKIP_ THEN USERERR(0,1,"Couldn't peek at ELF");
RETURN(A[2]);
END "peek";
PROCEDURE POKE(INTEGER ADR, CONTENTS);
BEGIN "poke" ! Stores CONTENTS at unibus address ADR;
DEFINE POKE = "'003000000000";
INTEGER ARRAY A[1:2];
A[1]←POKE+(ADR LSH -1);
A[2]←CONTENTS;
! CALLU0("MTAPE",ELFCHAN,A[1]);
ELFMTAPE(A[1]);
IF NOT _SKIP_ THEN USERERR(0,1,"Couldn't poke at ELF");
END "poke";
PROCEDURE POKEARRAY(INTEGER ADR, LTH; INTEGER ARRAY CONTENTS; INTEGER USETBITS(0));
BEGIN "pokearray" ! Sends the CONTENTS[1:LTH] to unibus address ADR
and higher;
INTEGER USETO_WORD,SNDIOWD;
USETO_WORD←'400010400000 + (ADR LSH -1)+USETBITS;
CALLU0("USETO",ELFCHAN,USETO_WORD);
SNDIOWD←IOWD(LTH,LOCATION(CONTENTS[1]));
CALLU0("OUT",ELFCHAN,SNDIOWD);
IF _SKIP_ THEN USERERR(0,1,"POKEARRAY failed");
END "pokearray";
PROCEDURE PEEKARRAY(INTEGER ADR, LTH; INTEGER ARRAY CONTENTS; INTEGER USETBITS(0));
BEGIN "peekarray" ! Gets the CONTENTS[1:LTH] from unibus address ADR
and higher;
INTEGER USETI_WORD,GETIOWD;
USETI_WORD←'400010400000 +(ADR LSH -1)+USETBITS;
CALLU0("USETI",ELFCHAN,USETI_WORD);
GETIOWD←IOWD(LTH,LOCATION(CONTENTS[1]));
CALLU0("IN",ELFCHAN,GETIOWD);
IF _SKIP_ THEN USERERR(0,1,"PEEKARRAY failed");
END "peekarray";
INTERNAL PROCEDURE ALINIT;
BEGIN "init"
INTEGER COUNT, BRCHAR, EOF, FLAG;
INTEGER I;
! Initialize the ELF for output;
! '400 on in mode word and EOF←1 to take silent return if not available;
EOF←1;
OPEN(ELFCHAN←GETCHAN,"ELF",'417,0,0,COUNT,BRCHAR,EOF);
IF EOF THEN BEGIN PRINT("ELF is not available."); CALL(0,"EXIT") END;
MTAPE_PLUS_ELF←'072000000000+(ELFCHAN LSH 23);
END "init";
! program to talk to PUMA from 10 via DZ11;
INTEGER line,i,j,char,idle;
! DZ11 definitions;
DEFINE DZCSR = "'760000"; ! Control and Status register;
DEFINE DZLPR = "'760002"; ! Line Parameter register (write only);
DEFINE DZRBUF = "'760002"; ! Receiver Buffer register (read only);
DEFINE DZTCR = "'760004"; ! Transmitter Control register (byte);
DEFINE DZTBUF = "'760006"; ! Transmitter Buffer (byte, write only);
PROCEDURE DZINIT; ! Set up the DZ11 using line # in LINE;
BEGIN
INTEGER i;
POKE(DZCSR,'20); ! Reset DZ11;
CALL(0,"SLEEP"); ! Sleep for 1 tick;
i ← '12430 + line; ! Line parameters: 300 baud, 8 char, no parity;
POKE(DZLPR,i); ! Tell DZ11 what parameters to use;
i ← 1 LSH line; ! Set up transmit bit for line we're using;
POKE(DZTCR,i); ! Turn on transmit for line;
POKE(DZCSR,'40); ! Turn on master scan enable;
END;
alinit;
PRINT(crlf & "PUMA Terminal program"&crlf&crlf);
! PRINT("Which line do you want? (0-7): ");
line ← 0; ! CVD(INCHWL) LAND 7;
define ctlv = "'047000400001";
define setact = "'051640000000";
quick_code
label tab,xit;
ctlv ; ! this turns on the no echo bit;
hrlzi 1,tab;
setact 1; ! get old activation table;
hrrzi 1,tab;
hrrzi 2,'20;
iorm 2,3(1); ! make bs activate;
setact 1; ! make new table;
jrst xit;
tab: 0;0;0;0;
xit:
end;
DZINIT;
WHILE TRUE DO
BEGIN ! Now talk;
IF (char ← INCHRS) ≥ 0 AND char≠'12 THEN
BEGIN ! Send char to PUMA;
DO i ← PEEK(DZCSR) UNTIL i LAND '100000; ! Wait til transmitter ready;
IF ¬(i LAND '40) THEN DZINIT; ! DZ11 zapped, re-enable it;
char ← char LAND '177;
POKE(DZTBUF,char);
idle ← 0;
END;
j ← PEEK(DZRBUF); ! Anything to write?;
IF j LAND '100000 THEN
BEGIN ! Write char from PUMA;
j ← j LAND '177;
IF j = '10 THEN j ← '177; ! Convert ASCII bs to null;
IF j ≠ '26 THEN OUTCHR( j ); ! Don't print ⊗ from VAL;
idle ← 0;
END;
IF idle THEN CALL(0,"SLEEP"); ! Sleep for 1 tick;
idle ← idle + 1;
IF idle = 20000 THEN PRINT(crlf & "Are you still there???" & crlf);
IF idle ≥ 36000 THEN
BEGIN
PRINT("Auto-exit!!!" & crlf);
POKE(DZCSR,'20); ! Reset DZ11;
CALL(0,"EXIT");
END;
END;
END;